Джентельмены, очень извиняюсь, рассчитываю, что ваши рекомендации пригодятся мне в будущем, но в данном случае как-то умудрился пропустить, что в условиях boolean comparsion в самом низу начального предложения стоит Неуязвимость к магии. Мне конкретно в данном случае этого достаточно. Ещё раз прошу прощения за потраченное вами время)
Все оказалось куда проще, чем я думала. (PS: rsfghd уже это же и написал, но ты его не понял)
В первом варианте у тебя "Units in range matching condition", к ней подсказка
Use 'Matching Unit' to refer to the unit on whom the comparison is being performed.
А ты использовал (Picked unit)! Почему так нельзя? Потому что, matching condition = значит там Filter внутри, а внутри фильтра используется функция GetFilterUnit т.е. (matching unit).
из triggerstrings.txt:
GetEnumUnitHint="When using the 'Pick Every Unit...' action, this refers to each unit as it is picked."
GetFilterUnitHint="Use this to refer to the unit being considered for 'Units Matching Condition' functions."
А вот (Picked unit) можно использовать, когда просто есть проход по группе, как в твоем втором варианте.
Я тут вытащила код триггера из карты из war3map.j
Сгенерированный код триггера
=========================================================================== Trigger: IshillUltimte ===========================================================================
function Trig_IshillUltimte_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A001' ) ) then
return false
endif
return true
endfunction
function Trig_IshillUltimte_Func002Func001Func002C takes nothing returns boolean
if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE) == false ) ) then
return false
endif
if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_GROUND) == true ) ) then
return false
endif
if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false ) ) then
return false
endif
if ( not ( IsUnitAlly(GetEnumUnit(), GetOwningPlayer(GetSpellAbilityUnit())) == false ) ) then
return false
endif
if ( not ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(GetSpellAbilityUnit())) == true ) ) then
return false
endif
if ( not ( GetOwningPlayer(GetEnumUnit()) != GetOwningPlayer(GetSpellAbilityUnit()) ) ) then
return false
endif
return true
endfunction
function Trig_IshillUltimte_Func002Func001C takes nothing returns boolean
if ( not Trig_IshillUltimte_Func002Func001Func002C() ) then
return false
endif
return true
endfunction
function Trig_IshillUltimte_Func002A takes nothing returns nothing
if ( Trig_IshillUltimte_Func002Func001C() ) then
call GroupAddUnitSimple( GetEnumUnit(), udg_UltimateIshillEffect )
else
endif
endfunction
function Trig_IshillUltimte_Actions takes nothing returns nothing
call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_UPDATED, "TRIGSTR_019" )
call ForGroupBJ( GetUnitsInRangeOfLocAll(600.00, GetUnitLoc(GetSpellAbilityUnit())), function Trig_IshillUltimte_Func002A )
call ForGroupBJ( udg_UltimateIshillEffect, function Trig_IshillUltimte_Func003A )
call TriggerSleepAction( 20.00 )
call ForGroupBJ( udg_UltimateIshillEffect, function Trig_IshillUltimte_Func005A )
call GroupClear( udg_UltimateIshillEffect )
endfunction
===========================================================================
function InitTrig_IshillUltimte takes nothing returns nothing
set gg_trg_IshillUltimte = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_IshillUltimte, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition( gg_trg_IshillUltimte, Condition( function Trig_IshillUltimte_Conditions ) )
call TriggerAddAction( gg_trg_IshillUltimte, function Trig_IshillUltimte_Actions )
endfunction
Маленькие оптимизации:
IsUnitAlly+GetOwningPlayer(GetSpellAbilityUnit()) и IsUnitEnemy по идее взаимоисключающие, хватило бы только IsUnitEnemy(...)
call ForGroupBJ( GetUnitsInRangeOfLocAll(600.00, GetUnitLoc(GetSpellAbilityUnit())), function Trig_IshillUltimte_Func002A )
Тут утечка локации, потому что GetUnitLoc создает новую, но она потом не удаляется. Решение в ГУИ: записать GetUnitLoc в глобальную (или локальную) переменную, пройтись по группе, и удалить локацию (DestroyLocation).
Проблема: у тебя, как называется в местном жаргоне, триггер не MUI. То есть он работает только с одним юнитом одновременно, если два юнита используют заклинание, то оно сломается.
Посмотри на Trig_IshillUltimte_Actions. Ты там используешь udg_UltimateIshillEffect до засыпания на 20с и после. Что будет если в этот промежуток времени кто-нибудь снова вызовет триггер? Ацская сотона. Я не знаю как принято, но по-моему единственный выход - это локально создать группу, чтобы она у кастующего юнита была своя, а в конце триггера её удалять.
Прочитай пару туториалов про локальные переменные и утечки. Если не прозреешь - перепишу всё на кастомный код за тебя, чтобы как пример был наглядный.
Оригинально) Круто, что работает.
По идее нужно не mdx открывать в Блокноте, а пересохранить модель в формат mdl и открывать в Блокноте её. Файлы tga являются просто другим форматом текстур, который используется в игре. Если слишком много весят, можешь перевести в blp, но считается, что у tga качество получше.
Я думаю, что нужно копать в сторону файлика war3campaign.imp, я не шарю в hex, хм. Думаю, что там побилось что-то
Обычный редактор помог мне понять в чем причина. У меня был триггер, который очищал память после ролика. Я наверное излишне заморачиваюсь с оптимизацией, ведь близзы такого и близко не делали, но я удаляю все, что уже не используется: звуки, области, локации и так далее. Так вот у меня было 3 области, на которые были повешены звуки. И хоть я и закомментил название переменных в коде в этом триггере, мне редактор звука не давал завести переменные до тех пор, пока я не удалил закомментированный код. Получилось по новой завести переменные и карта стала запускаться! Фух, я аж выдохнул, а то уже отчаяние подступало, неделя работы ушла бы коту под хвост. Огромное спасибо тебе дружище, что отозвался и пытался набрасывать на вентилятор варианты, ты очень поддержал меня морально в трудную минуту!
Оказывается причина была намного сложнее)))
Тот самый триггер-комментарий был обычным триггером (т.е хранил всю информацию о действиях и т.д), но отображался как комментарий
Поэтому помогло только его удаление
"Открыть редактор реестра (Windows + R, ввести regedit).
Перейти по пути HKEY_CURRENT_USER\SOFTWARE\Blizzard Entertainment\WorldEdit.
Найти строку Tool Windows и удалить ее.
Готово. Теперь редактор старых версий будет работать. Но проблема повторится, если зайти в редактор 1.32. При ее возникновении нужно заново удалить строку Tool Windows."
В настройках редактора попробуй поставить настройки графики средние или низкие.
проверил только что, ты прав, проблема в настройках графики, только наоборот, надо ставить Высокие чтобы модель не крашала редактор.
Собственно, фикс:
Зайти в редакторе в Файл -> Параметры
Поставить здесь всё на Высокие, либо галочку "параметры из варкрафта" и в самом варкрафте в настройках поставить всё на высокие.
Модели вообще редко тестируются на других настройках графики, в основном все пилится под Высокие, так что следует их оставить навсегда и не играть на других.
В любом случае приказ ПКМ - это приказ smart, то есть попробуй такой триггер:
Событие - Generic unit Отдал приказ цель-точка
Условие - Unit-type of (Triggering unit) равно Твой_городской_защитник и (Issued order) равно smart
Действие - Pause (Triggering unit), Issue order with no target Стоп (Triggering unit) и Unpause (Triggering unit)
8gabriel8, приоритет менять нельзя
стандартный ии использует это поле для контроля юнитов
пишем свой ии в котором вместо приоритета юзаем свою переменную которой можем задавать любое значение 8gabriel8:
Но для меня это путь в Москву через Владивосток
ну если между тобой и Москвой находится Владивосток то иначе никак(а вар3 как раз расположен за Владивостоком)
Пока для тестирования оставил вариант с маленькой атакой, так как для нее не требуется писать дополнительных скриптов. Я не знаю, как работают функции отбора групп (отрядов) по условиям и как это оптимизировано внутри игры, но есть подозрение, что если в таймере выбирать все стенки на карте и потом искать боевые единицы врага вокруг каждой из них, это может быть долго. Для такого варианта хорошо кэшировать стены при постройке, но я на время тестирования не стал над этим заморачиваться. Всем спасибо за помощь.
Мб переписать нужный тебе функционал под мх второй версии?
Я перенес минимум функций, т.к их вопервых овер дохрена, вовторых переносил самые популярные и простые, надо дллок тогда было.
vincent_freeman, да есть такая проблема. Да, будет исправлена когда у товарищей техадминов будет время и не будет заданий приоритетней. Скорее всего будет пофикшено в следующей версии сайта (v9). Нет смысла вычерпывать воду с тонущего корабля. Ждём.
Я не хочу всё супер правильно делать полдня, это такая мелочь, что это не мешает выполнять основные задачи.
Открытие системного меню блокируется для того, чтобы при выезде мыши за область рендеринга и отпускании клавиши оно не всплывало.
Теперь в ленте всегда листятся оригиналы.
А в списке ресурсов свернутое краткое описание и превью.
Плюс обновил UI индикации репоста на странице ресурса.
События мыши и нажатия хоткеев на мемхаке не синхронизируются, нужен или внешний синхронизатор или терпите задержку по 0.2 секунды.
Но опять таки, искали вы плохо или смотрели не внимательно. Стоит внимательнее почитать мои ресурсы на эту тему.
Микс на wasd движение есть в двух экземплярах, от пользователя Unryze и от ENAleksey, оба они работают по аналогичному принципу: нажатие WASD эмулирует нажатие стрелочек Arrow. Потому что только эти клавиши (ну и ESС) имеют игрока, хотите полноценный WASD - используйте Рефорджевые патчи, там с этим всё гораздо лучше.
Так вот по поводу микса, микс можно вшить прям в карту, и игроку не нужно ничего качать. Чтобы микс активировать, нужно просто использовать ExoprtAndInjectDll, функция есть в обоих версиях мемхака (если последний можно назвать 3 мемхаком).
Версия от Алексея немного багованная и вызывает конфликты с одновременным нажатием, версия Анрайза лучше и стабильней, но не неё антивирусы ругаются, это может не понравиться некоторым игрокам.
Пример карты, где WASD работает по сети в 126 патче
Ох, есть некоторый опыт в этом, правда не задокументированный, в общем: если вызовов мало, то GC прекрасно справляется, если вы обращаетесь к памяти очень часто, то GC вообще не вызывается. В общем от размеров проекта зависит. Если это наработка - то забейте болт. Если это большой проект - то забудьте за существование GC, и обнуляйте локалки очищайте таблицы, иначе ваша карта будет через час игры жрать 10 гигов. И я не утрирую, это мои наблюдения. Это не конкретно проблема луа, это проблема гавнорефа. И так, как реальный разработчиков 2,5 человека, которые доводили проекты на луа до конца, то истину придётся опробовать самостоятельно
Всем спасибо, все свободы.
Этот даунитос опять облажался. Кому интересно обьяснение:
Способность - Izanagi: при использовании делает героя однократно бессмертным(типа одноразового баффа на восстановить 100% хп при летальном уроне) на 20 сек, по истечению которых или при трате этого "баффа", выключается ультимативная абилка(G), т.е. атака совершенным Сусаноо, требующим оба глаза у владельца, а Изанаги жертвует одним глазом. Следовательно, Изанаги можно использовать лишь два раза за жизнь(в смысле до смерти и последующего перерождения), при втором использовании ты теряешь возможность использовать также D и F(которая является самой Изанаги).
Чушка была в том, что я запускал триггер 0.01 текста при пике героя, а в нем было указано "если реал = 0(реал таймера баффа)", то иф, который уничтожает одного юнита требования, или другого, если первый уже уничтожен, но при старте этот реал был равен нулю и оно автоматически отрезало одного из юнитов.
Аве "Игра - сообщение в чат для (All Players)"!
"Игра - сообщение в чат для (All Players)" Аве!
(Т.е. я просто хотел схалтурить и запихнуть убавление переменной таймера и действия, исходящие из ее значения, в триггер текста, а он запускается в пике потому что у некоторых персов есть постоянный текст, типа значения его "волшебной брони", прочей дичи.)
Andreiki, ну просто создаёшь апгрейд-пустышку (без каких-либо улучшений внутри него).
Называешь так, как ты хочешь что бы это отображалось в требованиях, ну типа "Наличие любого герой не ниже 10-го уровня".
Ставишь этот апгрейд в требованиях там где нужно (где это у тебя? у нанимаемого юнита, при постройке здания, в лавке у предмета, на способности у юнита).
Создаёшь триггер с событием "Юнит повышает уровень". Ставишь условие, что если героический уровень юнита-инициатора равен 10, создаёшь новое действие: Игрок - техоногии/апгрейды, установить уровень технологии "Наличие любого герой не ниже 10-го уровня" для игрока владеющего юнитом-инициатором как 1.
» WarCraft 3 / Условие триггера
» WarCraft 3 / Как удалить все файлы импорта?
» WarCraft 3 / Вылетает редактор карт
» WarCraft 3 / ⚽ Banjoball v1.21a: Эпичный Футбол с Магией в Warcraft 3! 🔥🎮
Ресурс должен включать ссылку на внешний видеоисточник или внутренний видеоплеер.
» WarCraft 3 / Пути к модельке способности
» WarCraft 3 / Анимация модели не фиксится в mdlvis
» WarCraft 3 / Классификация воина
» WarCraft 3 / illidan test
» WarCraft 3 / Приоритеты для атаки врагами
» WarCraft 3 / Перезарядка способности
» Администрация XGM / Просмотр моделей
» Администрация XGM / Дублирование ресурса в ленте
» WarCraft 3 / Нужна помощь с Мемхаком
» WarCraft 3 / AutoLoad RPG Maps
» WarCraft 3 / Ограничение в Lua
» WarCraft 3 / Требование уровня
» WarCraft 3 / Majesty Guilds Time